const CHUNK_SIZE = 1024 * 1024 * 10; // 10MB的分片大小
const THREAD_COUNT = navigator.hardwareConcurrency || 4; // 定义线程并发数量

// 文件切片函数
export const cutFile = (file: any) => {
  return new Promise((resolve) => {
    // 总分片数量
    const chunkCount = Math.ceil(file.size / CHUNK_SIZE);
    // 每个线程能分到多少分片去处理
    const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT);

    // 分片结果
    const result: any = [];
    // 计数：所有线程全部计算完毕
    let finishCount = 0;
    for (let i = 0; i < THREAD_COUNT; i++) {
      // 开启一个线程任务
      const worker = new Worker('./worker.js', {
        type: 'module', // 需要配置，否则导入不了
      });

      let start = i * threadChunkCount;
      // 如果最后的线程了，最后的分片数量小于计算出的每个线程能分到多少分片的值，则取最后的分片数量即可，即最小值
      let end = Math.min(start + threadChunkCount, chunkCount);
      worker.postMessage({
        file,
        start,
        end,
        CHUNK_SIZE,
      });
      worker.onmessage = (e) => {
        // 完成一个，线程结束
        worker.terminate();
        // 在消息里面拿到分片的结果
        // 注意不能使用push方法，因为每个线程的进度可能不同
        result[i] = e.data;
        // 每完成一个，计数加一
        finishCount++;

        if (finishCount === THREAD_COUNT) {
          resolve(result.flat()); // 二维数组拍扁
        }
      };
    }
  });
};
